#include<iostream>
#include<string>
using namespace std;

/*动态内存分配
1.内存区间：
  ·代码区：存放程序代码；
  ·全局变量与静态变量区：存放全局变量和静态变量以及对象；
  ·栈区(局部变量区)：存放局部变量；
  ·堆区(自由存储区)：存放动态分配对象。
2.动态：分配内存（运行时） 存储（堆区） 释放内存（手动释放）
  静态：分配内存（编译时） 存储（栈区） 释放内存（自动释放）
3.写法：
  new ---> 用来申请空间 ---> 相当于C语言中的 malloc
  delete ---> 用来释放空间 ---> 相当于C语言中的 free
 【注】new 和 delete 是配对的，有 new 就必须有 delete。
*/

/*深拷贝和浅拷贝

*/

//普通变量
/*void test1()
{
	int a; //静态分配
	a = 10;
	cout << a << endl;
	
	//动态分配
	int* p = new int(4); //指针p指向一个空间A，A中存放int型数据4
	*p = 2;
	cout << *p <<endl;
	delete p; // delete 用来释放 p 所指的空间A，而不是释放 p 的空间。
	
	p = new int(7); //再使指针p指向一个空间B，B中存放int型数据7
	cout << *p << endl;
	delete p; //释放p所指的空间B
	
	p = NULL;
}*/

//数组
/*void test2()
{
	int a[5] = { 1,2,3,4,5 }; //静态分配
	
	int n;
	cin >> n;
	int *p = new int[n]; //动态分配
	int i = 0;
	for(i = 0; i < n; i++)
		cin >> p[i];
	for(i = 0; i < n; i++)
		cout << p[i] << "  ";
	delete []p; //p前加一个[]，表示释放数组的全部元素
}*/

//类
/*class stu
{
	string name;
	int age;
public:
	stu(string n = " ", int a = 0) {name = n;age = a;}
	void show() {cout << name << "  " << age << endl;}
	void setinfo(string n, int a) {name = n;age = a;}
	~stu() {cout << "distractor!" << name << endl;}
};

void test3()
{
	stu s1("jiangdunhao", 29); //静态 调构造
	s1.show();
	
	stu* p = new stu("wangyiheng", 19); //动态 调构造
	p->show();
	delete p; //调析构
	
	stu s2[2] = {stu("luzhuohao", 29), stu("zhangyaoyuan", 25)};
	
	string name;
	int age;
	int i = 0;
	int n;
	cin >> n;
	p = new stu[n]; //调n次构造
	for(i = 0; i < n; i++)
	{
		cin >> name >> age;
		p[i].setinfo(name, age);
	}
	for(i = 0; i < n; i++)
		p[i].show();
	delete []p; //调析构
}*/

//深拷贝和浅拷贝
/*class Array{
	int n; //数组长度
	int* p; //指向数组的指针
public:
	Array(int sn)
	{
		n = sn;
		p = new int[n];
	}
	//浅拷贝
	//Array(Array &r) //拷贝构造  Array ar(ay);
	//{
	//	n = r.n;
	//	p = r.p;
	//}
	//浅拷贝会导致ar的p与ay的p指向同一个空间，在释放内存的时候就会被释放两次
	//因此需要使ar的p重新指向一个空间，且该空间的存储内容要与ay的p所指空间内容相同
	
	//深拷贝
	Array(Array &r)
	{
		n = r.n;
		p = new int[n];
		for(int i = 0; i < n; i++)
			p[i] = r.p[i];
	}
	~Array()
	{
		if(p != NULL)
		{	
			delete []p;
			p = NULL;
		}
	}
};

void test4()
{
	Array ay(4);
	Array ar(ay);
}*/
